package leetcode.easy;

import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;

/**
 * @author 马迪迪
 * @description: TODO
 * @data 2025年04月16日21时22分
 * <p>
 * 给定一个整数数组 nums 和一个整数 目标值target ，请你在该数组中找出 和为目标值 targer的两个整数，并且返回他们的下标
 * 你可以假设每一种输入只会对应一个答案，并且你不能使用两次相同的元素
 * <p>
 * 示例：
 * nums = [1,2,3,4,5,6,7] target = 8   结果就为：[2,4]
 */
public class 两数之和 {

    public static void main(String[] args) {
        Integer[] nums = new Integer[]{1, 2, 3, 4, 5, 6, 7};
        Integer target = 8;
        long start = System.nanoTime();
        Integer[] ints = twoSum2(nums, target);
        long end = System.nanoTime();
        long elapsedNanos = end - start;
        long elapsedMs = TimeUnit.NANOSECONDS.toMillis(elapsedNanos); // 转换为毫秒（整数部分）
        double preciseElapsedMs = elapsedNanos / 1_000_000.0; // 保留小数部分
        System.out.printf("所用时间：%f\n", preciseElapsedMs);
        System.out.println(Arrays.toString(ints));
    }


    public static Integer[] twoSum1(Integer[] nums, int target) {
        Integer[] result = new Integer[2];
        for (int i = 0; i < nums.length; i++) {
            for (int j = i + 1; j < nums.length; j++) {
                if (nums[i] + nums[j] == target) {
                    result[0] = i;
                    result[1] = j;
                }
            }
        }
        return result;
    }

    /**
     * 新解法 ： 时间复杂服降低
     * O1 复杂度
     * @param nums
     * @param target
     * @return
     */
    public static Integer[] twoSum2(Integer[] nums, int target) {
        Map<Integer, Integer> hashtable = new HashMap<Integer, Integer>();
        for (int i = 0; i <= nums.length; ++i) {
            if (hashtable.containsKey(target - nums[i])) {
                return new Integer[]{hashtable.get(target - nums[i]), i};
            }
            hashtable.put(nums[i], i);
        }
        return new Integer[0];
    }
}
